package ar.com.age.distribuidora.presentacion.controller;

import java.util.Date;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

import org.primefaces.context.RequestContext;

import ar.com.age.distribuidora.dominio.Cheque;
import ar.com.age.distribuidora.dominio.PagoCheque;
import ar.com.age.distribuidora.presentacion.util.Mensajes;
import ar.com.age.distribuidora.presentacion.util.ServiceLocator;
import ar.com.age.distribuidora.presentacion.util.ValidadorTipoUsuario;

@ManagedBean
@ViewScoped
public class PagoChequeBean {

	private String codigoRegistrar;
	
	private String comentarioRegistrar;
	
	private Date fechaPagoRegistrar;
	
	private Cheque chequeSeleccionadoRegistrar;

	private List<Cheque> cheques;

	private List<PagoCheque> pagos;
	
	private PagoCheque pagoSeleccionado;  
    
	private PagoCheque pagoSeleccionadoDetalles;
	
	private String codigoBuscar;
	
	private String estadoBuscar;
    
	private Date fechaDesdeBuscar;
	
	private Date fechaHastaBuscar;
	
	private String chequeBuscar;

	private boolean panelBuscarVisibilidad;
	
	private boolean panelEditarVisibilidad;

	private boolean panelRegistrarVisibilidad;

	private Cheque chequeAux;
	
	private String nombreCheque;
	

	public PagoChequeBean() {
		
		ValidadorTipoUsuario.validarEmpleadoCompra();

		//this.cheques = ServiceLocator.getChequeService().buscarTodosCheque();
		this.cheques = ServiceLocator.getChequeService().buscarCheque("", "", "", "", "", null, null, null, Mensajes.CHEQUE_DENTRO_EMPRESA);

		this.panelEditarVisibilidad = false;
		this.panelRegistrarVisibilidad = true;
		this.panelBuscarVisibilidad = false;
		
	}
	
	public boolean isPanelBuscarVisibilidad() {
		return panelBuscarVisibilidad;
	}

	public void setPanelBuscarVisibilidad(boolean panelBuscarVisibilidad) {
		this.panelBuscarVisibilidad = panelBuscarVisibilidad;
	}

	public Cheque getChequeAux() {
		return chequeAux;
	}

	public void setChequeAux(Cheque chequeAux) {
		this.chequeAux = chequeAux;
	}

	public String getNombreCheque() {
		return nombreCheque;
	}

	public void setNombreCheque(String nombreCheque) {
		this.nombreCheque = nombreCheque;
	}

	public boolean isPanelEditarVisibilidad() {
		return panelEditarVisibilidad;
	}

	public void setPanelEditarVisibilidad(boolean panelEditarVisibilidad) {
		this.panelEditarVisibilidad = panelEditarVisibilidad;
	}

	public boolean isPanelRegistrarVisibilidad() {
		return panelRegistrarVisibilidad;
	}

	public void setPanelRegistrarVisibilidad(boolean panelRegistrarVisibilidad) {
		this.panelRegistrarVisibilidad = panelRegistrarVisibilidad;
	}

	public String getCodigoRegistrar() {
		return codigoRegistrar;
	}

	public void setCodigoRegistrar(String codigoRegistrar) {
		this.codigoRegistrar = codigoRegistrar;
	}

	public String getComentarioRegistrar() {
		return comentarioRegistrar;
	}

	public void setComentarioRegistrar(String comentarioRegistrar) {
		this.comentarioRegistrar = comentarioRegistrar;
	}

	public Date getFechaPagoRegistrar() {
		return fechaPagoRegistrar;
	}

	public void setFechaPagoRegistrar(Date fechaPagoRegistrar) {
		this.fechaPagoRegistrar = fechaPagoRegistrar;
	}

	public List<PagoCheque> getPagos() {
		return pagos;
	}

	public void setPagos(List<PagoCheque> pagos) {
		this.pagos = pagos;
	}

	public PagoCheque getPagoSeleccionado() {
		return pagoSeleccionado;
	}

	public void setPagoSeleccionado(PagoCheque pagoSeleccionado) {
		this.pagoSeleccionado = pagoSeleccionado;
	}

	public PagoCheque getPagoSeleccionadoDetalles() {
		return pagoSeleccionadoDetalles;
	}

	public void setPagoSeleccionadoDetalles(PagoCheque pagoSeleccionadoDetalles) {
		this.pagoSeleccionadoDetalles = pagoSeleccionadoDetalles;
	}

	public String getCodigoBuscar() {
		return codigoBuscar;
	}

	public String getEstadoBuscar() {
		return estadoBuscar;
	}

	public void setEstadoBuscar(String estadoBuscar) {
		this.estadoBuscar = estadoBuscar;
	}

	public void setCodigoBuscar(String codigoBuscar) {
		this.codigoBuscar = codigoBuscar;
	}

	public Date getFechaDesdeBuscar() {
		return fechaDesdeBuscar;
	}

	public void setFechaDesdeBuscar(Date fechaDesdeBuscar) {
		this.fechaDesdeBuscar = fechaDesdeBuscar;
	}

	public Date getFechaHastaBuscar() {
		return fechaHastaBuscar;
	}

	public void setFechaHastaBuscar(Date fechaHastaBuscar) {
		this.fechaHastaBuscar = fechaHastaBuscar;
	}

	public Cheque getChequeSeleccionadoRegistrar() {
		return chequeSeleccionadoRegistrar;
	}

	public void setChequeSeleccionadoRegistrar(Cheque chequeSeleccionadoRegistrar) {
		this.chequeSeleccionadoRegistrar = chequeSeleccionadoRegistrar;
	}

	public List<Cheque> getCheques() {
		return cheques;
	}

	public void setCheques(List<Cheque> cheques) {
		this.cheques = cheques;
	}

	public String getChequeBuscar() {
		return chequeBuscar;
	}

	public void setChequeBuscar(String chequeBuscar) {
		this.chequeBuscar = chequeBuscar;
	}

	
	// Metodos del Bean

	public String registrarPagoCheque() {
		
		PagoCheque pago = new PagoCheque();
		pago.setCodigo(codigoRegistrar);
		pago.setComentario(comentarioRegistrar);
		pago.setFecha(fechaPagoRegistrar);
		pago.setEstado("Disponible");
		chequeSeleccionadoRegistrar.setEstadoCheque(ServiceLocator.getChequeService().retornarEstadoCheque(Mensajes.CHEQUE_FUERA_EMPRESA ));
		ServiceLocator.getChequeService().crearOEditarCheque(chequeSeleccionadoRegistrar);
		pago.setCheque(chequeSeleccionadoRegistrar);
		
		// Registro el Movimiento para la Auditoria de Cheques
		ServiceLocator.getAuditoriaChequeService().crearOEditarMovimientoCheque(chequeSeleccionadoRegistrar, Mensajes.PAGO_CHEQUE);
		
		ServiceLocator.getCompraService().crearOEditarPagoCheque(pago);
		
		FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Advertencia", "La operacion se ha realizado con exito.");  
		RequestContext.getCurrentInstance().showMessageInDialog(message);
		
		this.cheques = ServiceLocator.getChequeService().buscarCheque("", "", "", "", "", null, null, null, Mensajes.CHEQUE_DENTRO_EMPRESA);
		fechaPagoRegistrar = null;
		codigoRegistrar = null;
		comentarioRegistrar = null;
		
		return null;
	}
	
	
	public String actualizarPagoCheque() {
		
		if (this.pagoSeleccionado != null) {
			
			FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Pago de Cheque",  "Pago de efectivo editada con exito.");  
	        RequestContext.getCurrentInstance().showMessageInDialog(message);
	        
	        if (this.pagoSeleccionado.getCheque() == null) {
	        	this.pagoSeleccionado.setCheque(this.chequeAux);
			} else {
				// El cheque anterior vuelve a estar dentro de la emrpresa
				this.chequeAux.setEstadoCheque(ServiceLocator.getChequeService().retornarEstadoCheque(Mensajes.CHEQUE_DENTRO_EMPRESA));
				ServiceLocator.getChequeService().crearOEditarCheque(this.chequeAux);
				ServiceLocator.getAuditoriaChequeService().crearOEditarMovimientoCheque(chequeAux, Mensajes.ELIMINACION_PAGO_CHEQUE);
				
				this.pagoSeleccionado.getCheque().setEstadoCheque(ServiceLocator.getChequeService().retornarEstadoCheque(Mensajes.CHEQUE_FUERA_EMPRESA));
				ServiceLocator.getChequeService().crearOEditarCheque(this.pagoSeleccionado.getCheque());
				ServiceLocator.getAuditoriaChequeService().crearOEditarMovimientoCheque(this.pagoSeleccionado.getCheque(), Mensajes.PAGO_CHEQUE);
			}
	        
	        pagoSeleccionado.setMonto(pagoSeleccionado.getCheque().getMonto());
	        
			ServiceLocator.getCompraService().crearOEditarPagoCheque(pagoSeleccionado);
			this.pagoSeleccionado = null;
			
			this.chequeAux = null;
			this.nombreCheque = null;
			//this.cheques = ServiceLocator.getChequeService().buscarTodosCheque();
			this.cheques = ServiceLocator.getChequeService().buscarCheque("", "", "", "", "", null, null, null, Mensajes.CHEQUE_DENTRO_EMPRESA);
			
			this.panelEditarVisibilidad = false;
			this.panelRegistrarVisibilidad = true;
		 
			return null;
		} else {
			
			FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Pago Cheque",  "No se ha seleccionado un pago.");  
	        FacesContext.getCurrentInstance().addMessage(null, message);  
			return null;
		}
	}
	
	public String editarPagoCheque() {
		
		if (this.pagoSeleccionado != null) {
			
			this.panelEditarVisibilidad = true;
			this.panelRegistrarVisibilidad = false;
			this.panelBuscarVisibilidad = false;
			
			this.chequeAux = this.pagoSeleccionado.getCheque();
			this.nombreCheque = this.pagoSeleccionado.getCheque().getNumero();
			
			for(int i = 0; i < cheques.size(); i++){
				if (chequeAux.getNumero().equals(cheques.get(i).getNumero())) {
					cheques.remove(i);
				}
			}
			
			return null;

		} else {
			
			FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Advertencia", "No ha seleccionado ningun elemento.");  
	        RequestContext.getCurrentInstance().showMessageInDialog(message);
			return null;
		}	

	}
	
	public String eliminarPagoCheque() {
		
		if (this.pagoSeleccionado != null) {

			try {
				
				// El cheque anterior vuelve a estar dentro de la emrpresa
				pagoSeleccionado.getCheque().setEstadoCheque(ServiceLocator.getChequeService().retornarEstadoCheque(Mensajes.CHEQUE_DENTRO_EMPRESA));
				ServiceLocator.getChequeService().crearOEditarCheque(this.pagoSeleccionado.getCheque());
				ServiceLocator.getAuditoriaChequeService().crearOEditarMovimientoCheque(pagoSeleccionado.getCheque(), Mensajes.ELIMINACION_PAGO_CHEQUE);
				
				ServiceLocator.getCompraService().eliminarPagoCheque(pagoSeleccionado);
			} catch (Exception e) {
				
				FacesMessage message2 = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", Mensajes.ELEMENTO_ASIGNADO);  
		        RequestContext.getCurrentInstance().showMessageInDialog(message2);
				return null;
			}
			
			this.pagoSeleccionado = null;
			
			this.cheques = ServiceLocator.getChequeService().buscarCheque("", "", "", "", "", null, null, null, Mensajes.CHEQUE_DENTRO_EMPRESA);
			this.pagos = ServiceLocator.getCompraService().buscarPagoCheque(codigoBuscar, estadoBuscar, fechaDesdeBuscar, fechaHastaBuscar, chequeBuscar);

			FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Advertencia", Mensajes.OPERACION_EXITOSA);  
			RequestContext.getCurrentInstance().showMessageInDialog(message);
			
			return null;

		} else {
			
			FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Advertencia", Mensajes.ELEMENTO_NO_SELECCIONADO);  
	        RequestContext.getCurrentInstance().showMessageInDialog(message);
			return null;
		}	

	}

	public String buscarPagoCheque() {
		
			
		this.pagos = ServiceLocator.getCompraService().buscarPagoCheque(codigoBuscar, estadoBuscar, fechaDesdeBuscar, fechaHastaBuscar, chequeBuscar);

		if (this.pagos != null && !this.pagos.isEmpty()) {

			return null;

		} else {

			FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Advertencia", "No se encotraron resultados para la busqueda.");  
			RequestContext.getCurrentInstance().showMessageInDialog(message);
			return null;		
		}
	}
	
	public void visibilizarBuscar() {
		
		panelBuscarVisibilidad = true;
		panelEditarVisibilidad = false;
		panelRegistrarVisibilidad = false;
	}
	
	public void visibilizarRegistrar() {
		
		panelBuscarVisibilidad = false;
		panelEditarVisibilidad = false;
		panelRegistrarVisibilidad = true;
	}
	
	public void volverBusqueda() {
		
		panelBuscarVisibilidad = true;
		panelEditarVisibilidad = false;
		this.pagos = ServiceLocator.getCompraService().buscarPagoCheque(codigoBuscar, estadoBuscar, fechaDesdeBuscar, fechaHastaBuscar, chequeBuscar);
	}
}
